package pe.gob.mef.snip.preinversion.controller;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import pe.gob.mef.snip.preinversion.util.ServiceException;
import pe.gob.mef.snip.preinversion.domain.Conglomerado;
import pe.gob.mef.snip.preinversion.domain.Departamento;
import pe.gob.mef.snip.preinversion.domain.Distrito;
import pe.gob.mef.snip.preinversion.domain.FuncionOdi;
import pe.gob.mef.snip.preinversion.domain.ProgramaOdi;
import pe.gob.mef.snip.preinversion.domain.Provincia;
import pe.gob.mef.snip.preinversion.domain.ProyectoBanco;
import pe.gob.mef.snip.preinversion.domain.SubprogramaOdi;
import pe.gob.mef.snip.preinversion.domain.SubprogramaOdi2009;
import pe.gob.mef.snip.preinversion.domain.TakeaNumber;
import pe.gob.mef.snip.preinversion.domain.Ubigeo;
import pe.gob.mef.snip.preinversion.domain.UnidadOdi;
import pe.gob.mef.snip.preinversion.service.ConglomeradoService;
import pe.gob.mef.snip.preinversion.service.DepartamentoService;
import pe.gob.mef.snip.preinversion.service.DistritoService;
import pe.gob.mef.snip.preinversion.service.FuncionOdiService;
import pe.gob.mef.snip.preinversion.service.LocalizacionService;
import pe.gob.mef.snip.preinversion.service.ProgramaOdiService;
import pe.gob.mef.snip.preinversion.service.ProvinciaService;
import pe.gob.mef.snip.preinversion.service.ProyectoBancoService;
import pe.gob.mef.snip.preinversion.service.SubprogramaOdi2009Service;
import pe.gob.mef.snip.preinversion.service.SubprogramaOdiService;
import pe.gob.mef.snip.preinversion.service.TakeaNumberService;
import pe.gob.mef.snip.preinversion.service.UbigeoService;
import pe.gob.mef.snip.preinversion.service.UnidadOdiService;
import pe.gob.mef.snip.preinversion.util.Parametros;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

@Controller
public class IdentificacionController {
	
	protected final Log log = LogFactory.getLog(getClass());
	
	@Autowired
	private FuncionOdiService funcionOdiService;	
	@Autowired	
	private ProgramaOdiService programaOdiService;	
	@Autowired	
	private SubprogramaOdiService subprogramaOdiService;	
	@Autowired	
	private UnidadOdiService unidadOdiService;	
	@Autowired	
	private ConglomeradoService conglomeradoService;
	@Autowired	
	private DepartamentoService departamentoService;
	@Autowired	
	private ProvinciaService provinciaService;
	@Autowired	
	private DistritoService distritoService;
	@Autowired	
	private UbigeoService ubigeoService;	
	
	
	@Autowired	
	private ProyectoBancoService proyectoBancoService;
	@Autowired	
	private LocalizacionService localizacionService;
	
	private FuncionOdi funcionOdi;
	private ProgramaOdi programaOdi;
	private SubprogramaOdi subprogramaOdi;
	private UnidadOdi unidadOdi;
	private Conglomerado conglomerado;
	private ProyectoBanco proyectoBanco; 
	private Departamento departamento; 
	private Provincia provincia; 
	private Distrito distrito;  
	private Ubigeo ubigeo;
	
	@RequestMapping("/identificacionSnip03Listar")
	public ModelAndView identificacionSnip03Listar(HttpServletRequest request, HttpServletResponse response) {
			
		if (log.isDebugEnabled()) log.debug("identificacionSnip03Listar(HttpServletRequest,HttpServletResponse");	
		
		
		String idProyecto = "";
		
		funcionOdi = new FuncionOdi();
		programaOdi = new ProgramaOdi();
		subprogramaOdi = new SubprogramaOdi();
		unidadOdi = new UnidadOdi();
		conglomerado = new Conglomerado();
		departamento = new Departamento();
		provincia = new Provincia();
		distrito  = new Distrito();
	    
		Map<String, Object> identificacionSnip03Map = new HashMap<String, Object>();
		
		System.out.println("Parametro idProyecto del request: " + request.getParameter("idProyecto"));
		
		
		HttpSession session = request.getSession();	
		session.setAttribute("idProyecto", (String) request.getParameter("idProyecto"));
		
		System.out.println("Parametro idProyecto de session: " + session.getAttribute("idProyecto"));
	
		try{	
		funcionOdiService.listar(funcionOdi);
		List<FuncionOdi> funcionOdiList = funcionOdi.getResultList();

		programaOdiService.listar(programaOdi);
		List<FuncionOdi> programaOdiList = programaOdi.getResultList();
		
		subprogramaOdiService.listar(subprogramaOdi);
		List<FuncionOdi> subprogramaOdiList = subprogramaOdi.getResultList();
		
		unidadOdiService.listar(unidadOdi);
		List<FuncionOdi> unidadOdiList = unidadOdi.getResultList();
		
		departamentoService.listar(departamento);
		List<Departamento> departamentoList = departamento.getResultList();
		
		provinciaService.listar(provincia);
		List<Provincia> provinciaList = provincia.getResultList();
		
		distritoService.listar(distrito);
		List<FuncionOdi> distritoList = distrito.getResultList();
				
		identificacionSnip03Map.put("idProyecto", idProyecto);		
		identificacionSnip03Map.put("funcionOdiList", funcionOdiList);		
		identificacionSnip03Map.put("programaOdiList", programaOdiList);		
		identificacionSnip03Map.put("subprogramaOdiList", subprogramaOdiList);		
		identificacionSnip03Map.put("unidadOdiList", unidadOdiList);			
		identificacionSnip03Map.put("departamentoList", departamentoList);			
		identificacionSnip03Map.put("provinciaList", provinciaList);			
		identificacionSnip03Map.put("distritoList", distritoList);	
		identificacionSnip03Map.put("accion", (String) request.getParameter("accion"));	
		
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return new ModelAndView("frmIdentificacionSnip03","identificacionSnip03Map",identificacionSnip03Map);
	}

	
	
	@RequestMapping("/identificacionSnip03Guardar")
	public ModelAndView identificacionSnip03Guardar(HttpServletRequest request, HttpServletResponse response) {	

		if (log.isDebugEnabled()) log.debug("identificacionSnip03Guardar(HttpServletRequest,HttpServletResponse");

		Map<String, Object> estudiosSnip03Map = new HashMap<String, Object>();
		proyectoBanco = new ProyectoBanco();
		
		try{
		
		System.out.println("[ " + request.getParameter("txt_codigoProyectoBanco") + " , " + request.getParameter("txt_nombreProyectoBanco") + " , " 
							   + request.getParameter("sel_cargarFuncionOdi") + " , " + request.getParameter("sel_cargarProgramaOdi") + " , " 
				               + request.getParameter("sel_cargarSubProgramaOdi") + " , " + request.getParameter("txt_responsableFormulacion") + " , " 
							   + request.getParameter("txt_responsableUnidadFormulacion") + " , " + request.getParameter("txt_cargarResponsableEjecucion") + " ]"
							   );	
		
		proyectoBanco.setProyecto(new BigDecimal(request.getParameter("txt_codigoProyectoBanco")));
		proyectoBanco.setNombreProy(request.getParameter("txt_nombreProyectoBanco"));
		proyectoBanco.setFuncionOdi(request.getParameter("sel_cargarFuncionOdi"));
		proyectoBanco.setProgramaOdi(request.getParameter("sel_cargarProgramaOdi"));
		proyectoBanco.setSubprogramaOdi(request.getParameter("sel_cargarSubProgramaOdi"));	
		proyectoBanco.setRespFormularUf(request.getParameter("txt_responsableFormulacion"));
		proyectoBanco.setRespNombreUf(request.getParameter("txt_responsableUnidadFormulacion"));
		proyectoBanco.setRespNombreUe(request.getParameter("txt_cargarResponsableEjecucion"));	
		proyectoBanco.setVersion(new BigDecimal(Parametros.VERSION_FICHA_1));
		
		System.out.println("[ " + proyectoBanco.getProyecto().toString() + " , " + proyectoBanco.getNombreProy() + " , " 
				   + proyectoBanco.getFuncionOdi() + " , " + proyectoBanco.getProgramaOdi() + " , " 
	               + proyectoBanco.getSubprogramaOdi() + " , " + proyectoBanco.getRespFormularUf() + " , " 
				   + proyectoBanco.getRespNombreUf() + " , " + proyectoBanco.getRespNombreUe() + " , " + proyectoBanco.getVersion() + " ]"
				   );	
		
		proyectoBancoService.insertar(proyectoBanco);	
		
		
		} catch (ServiceException e) {
			e.printStackTrace();
			e.getMessage();
		} catch (Exception e) {
			e.printStackTrace();
			e.getMessage();
		}
						
		return new ModelAndView("frmEstudios","estudiosSnip03Map",estudiosSnip03Map);
	}


	
	@RequestMapping("/identificacionSnip04Listar")
	public ModelAndView identificacionSnip04Listar(HttpServletRequest request, HttpServletResponse response) {

		if (log.isDebugEnabled()) log.debug("identificacionSnip04Listar(HttpServletRequest,HttpServletResponse");

		funcionOdi = new FuncionOdi();
		programaOdi = new ProgramaOdi();
		subprogramaOdi = new SubprogramaOdi();
		unidadOdi = new UnidadOdi();
		conglomerado = new Conglomerado();
		
		String idProyecto = "";
	    		
		Map<String, Object> identificacionSnip04Map = new HashMap<String, Object>();
		
		try {

		
		funcionOdiService.listar(funcionOdi);
		List<FuncionOdi> funcionOdiList = funcionOdi.getResultList();

		programaOdiService.listar(programaOdi);
		List<FuncionOdi> programaOdiList = programaOdi.getResultList();
		
		subprogramaOdiService.listar(subprogramaOdi);
		List<FuncionOdi> subprogramaOdiList = subprogramaOdi.getResultList();
		
		unidadOdiService.listar(unidadOdi);
		List<FuncionOdi> unidadOdiList = unidadOdi.getResultList();

		
		identificacionSnip04Map.put("idProyecto", idProyecto);		
		identificacionSnip04Map.put("funcionOdiList", funcionOdiList);		
		identificacionSnip04Map.put("programaOdiList", programaOdiList);		
		identificacionSnip04Map.put("subprogramaOdiList", subprogramaOdiList);		
		identificacionSnip04Map.put("unidadOdiList", unidadOdiList);
		
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//return new ModelAndView("frmIdentificacionSnip04","identificacionSnip04Map",identificacionSnip04Map);
		return new ModelAndView("frmIdentificacionSnip04","identificacionSnip04Map",identificacionSnip04Map);		
	}
	
	
	@RequestMapping("/identificacionSnip04Grabar")
	public ModelAndView identificacionSnip04Grabar	(HttpServletRequest request, HttpServletResponse response) {
		
		funcionOdi = new FuncionOdi();
		
		Map<String, Object> alternativaMap = new HashMap<String, Object>();
		alternativaMap.put("funcionOdi", funcionOdi);

		return new ModelAndView("frmIdentificacionSnip04","alternativaMap",alternativaMap);
	}
	

	@RequestMapping("/identificacionSnip03Buscar")
	public ModelAndView identificacionSnip03Buscar(HttpServletRequest request, HttpServletResponse response) {
			
		if (log.isDebugEnabled()) log.debug("identificacionSnip03Buscar(HttpServletRequest,HttpServletResponse");	
		
		Map<String, Object> identificacionSnip03Map = new HashMap<String, Object>();	
		String idProyecto = (String) request.getParameter("idProyecto");
		try{	
			identificacionSnip03Map.put("idProyecto", idProyecto);
						
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return new ModelAndView("frmIdentificacionSnip03","identificacionSnip03Map",identificacionSnip03Map);
	}	

	

	@RequestMapping("/identificacionSnip03CargarListaProvincia")
	public @ResponseBody List<Map<String, String>> identificacionSnip03CargarListaProvincia(HttpServletRequest request, HttpServletResponse response) {
			
		if (log.isDebugEnabled()) log.debug("identificacionSnip03CargarListaProvincia(HttpServletRequest,HttpServletResponse");	
		
		List<Map<String, String>> lstJSON = new ArrayList<Map<String, String>>();
		try{	
			ubigeo = new Ubigeo();
			ubigeo.setCodigoDepartamento(Integer.parseInt(request.getParameter("idDepartamento")));
			ubigeoService.listarProvincia(ubigeo);		
			List<Ubigeo> lstUbigeos = ubigeo.getResultList();
			
			for (Ubigeo item : lstUbigeos) {
				Map<String, String> elem = new HashMap<String, String>();
				elem.put("c",Integer.toString(item.getCodigoProvincia()));
				elem.put("d",Integer.toString(item.getCodigoProvincia())+ " - " + item.getNombreProvincia());
				lstJSON.add(elem);
			}
			
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println(lstJSON);
		return lstJSON;
		

	}	
	
	

	@RequestMapping("/identificacionSnip03CargarListaDistrito")
	public @ResponseBody List<Map<String, String>> identificacionSnip03CargarListaDistrito(HttpServletRequest request, HttpServletResponse response) {
			
		if (log.isDebugEnabled()) log.debug("identificacionSnip03CargarListaDistrito(HttpServletRequest,HttpServletResponse");	
		
		List<Map<String, String>> lstJSON = new ArrayList<Map<String, String>>();
	
		try{	

			ubigeo = new Ubigeo();
			ubigeo.setCodigoDepartamento(Integer.parseInt(request.getParameter("idDepartamento")));
			ubigeo.setCodigoProvincia(Integer.parseInt(request.getParameter("idProvincia")));
			ubigeoService.listarDistrito(ubigeo);
			
			List<Ubigeo> lstUbigeos = ubigeo.getResultList();
			
			for (Ubigeo item : lstUbigeos) {
				Map<String, String> elem = new HashMap<String, String>();
				elem.put("c",Integer.toString(item.getCodigoDistrito()));
				elem.put("d",Integer.toString(item.getCodigoDistrito()) + " - " + item.getNombreDistrito());
				lstJSON.add(elem);
			}
			
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println(lstJSON);
		return lstJSON;
		

	}	
	
	
	
	
	
	
	

	
}
